package com.lihan.netty;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;

/**
 * ClassName: WsServerInitialzer
 * Package: com.lihan.websocket
 * Description:
 *  处理器
 * @Author 李涵
 * @Create 2025-02-25 17:29
 * @Version 1.0
 */
public class WSServerInitialzer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        //获取管道（pipeline）
        ChannelPipeline pipeline = channel.pipeline();

        //websocket 基于http协议 所需要的 http编解码器
        pipeline.addLast(new HttpServerCodec());
        //http上有一些数据流产生，有大有小，我们需要使用netty对数据流写 提供支持
        pipeline.addLast(new ChunkedWriteHandler());
        //对 httpMessage进行聚合处理 ，聚合成request 或 response
        pipeline.addLast(new HttpObjectAggregator(1024*64));

        /*
         * 针对客户端，如果1分钟事件内没有向服务端发送心跳（ALL),则主动断开连接
         * 如果有读空闲和写空闲，则不做任何处理
         * */
        //激活空闲状态的handler --秒 分别是读空闲，写空闲和读写空闲
        pipeline.addLast(new IdleStateHandler(60,120,600));
        //对心跳处理的处理器
        pipeline.addLast(new HeartBeatHandler());

        //  websocket 服务端路由地址
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));

        //自定义handler，处理消息聊天
        pipeline.addLast(new ChatHandler());
    }
}
